/*
	Dimension by HTML5 UP
	html5up.net | @ajlkn
	Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
*/

(function($) {
  skel.breakpoints({
    xlarge: "(max-width: 1680px)",
    large: "(max-width: 1280px)",
    medium: "(max-width: 980px)",
    small: "(max-width: 736px)",
    xsmall: "(max-width: 480px)",
    xxsmall: "(max-width: 360px)"
  });

  $(function() {
    var $window = $(window),
      $body = $("body"),
      $wrapper = $("#wrapper"),
      $header = $("#header"),
      $footer = $("#footer"),
      $main = $("#main"),
      $main_articles = $main.children("article");

    // Disable animations/transitions until the page has loaded.
    $body.addClass("is-loading");

    $window.on("load", function() {
      window.setTimeout(function() {
        $body.removeClass("is-loading");
      }, 100);
    });

    // Fix: Placeholder polyfill.
    $("form").placeholder();

    // Fix: Flexbox min-height bug on IE.
    if (skel.vars.IEVersion < 12) {
      var flexboxFixTimeoutId;

      $window
        .on("resize.flexbox-fix", function() {
          clearTimeout(flexboxFixTimeoutId);

          flexboxFixTimeoutId = setTimeout(function() {
            if ($wrapper.prop("scrollHeight") > $window.height())
              $wrapper.css("height", "auto");
            else $wrapper.css("height", "100vh");
          }, 250);
        })
        .triggerHandler("resize.flexbox-fix");
    }

    // Nav.
    var $nav = $header.children("nav"),
      $nav_li = $nav.find("li");

    // Add "middle" alignment classes if we're dealing with an even number of items.
    if ($nav_li.length % 2 == 0) {
      $nav.addClass("use-middle");
      $nav_li.eq($nav_li.length / 2).addClass("is-middle");
    }

    // Main.
    var delay = 325,
      locked = false;

    // Methods.
    $main._show = function(id, initial) {
      var $article = $main_articles.filter("#" + id);

      // No such article? Bail.
      if ($article.length == 0) return;

      // Handle lock.

      // Already locked? Speed through "show" steps w/o delays.
      if (locked || (typeof initial != "undefined" && initial === true)) {
        // Mark as switching.
        $body.addClass("is-switching");

        // Mark as visible.
        $body.addClass("is-article-visible");

        // Deactivate all articles (just in case one's already active).
        $main_articles.removeClass("active");

        // Hide header, footer.
        $header.hide();
        $footer.hide();

        // Show main, article.
        $main.show();
        $article.show();

        // Activate article.
        $article.addClass("active");

        // Unlock.
        locked = false;

        // Unmark as switching.
        setTimeout(
          function() {
            $body.removeClass("is-switching");
          },
          initial ? 1000 : 0
        );

        return;
      }

      // Lock.
      locked = true;

      // Article already visible? Just swap articles.
      if ($body.hasClass("is-article-visible")) {
        // Deactivate current article.
        var $currentArticle = $main_articles.filter(".active");

        $currentArticle.removeClass("active");

        // Show article.
        setTimeout(function() {
          // Hide current article.
          $currentArticle.hide();

          // Show article.
          $article.show();

          // Activate article.
          setTimeout(function() {
            $article.addClass("active");

            // Window stuff.
            $window.scrollTop(0).triggerHandler("resize.flexbox-fix");

            // Unlock.
            setTimeout(function() {
              locked = false;
            }, delay);
          }, 25);
        }, delay);
      }

      // Otherwise, handle as normal.
      else {
        // Mark as visible.
        $body.addClass("is-article-visible");

        // Show article.
        setTimeout(function() {
          // Hide header, footer.
          $header.hide();
          $footer.hide();

          // Show main, article.
          $main.show();
          $article.show();

          // Activate article.
          setTimeout(function() {
            $article.addClass("active");

            // Window stuff.
            $window.scrollTop(0).triggerHandler("resize.flexbox-fix");

            // Unlock.
            setTimeout(function() {
              locked = false;
            }, delay);
          }, 25);
        }, delay);
      }
    };

    $main._hide = function(addState) {
      var $article = $main_articles.filter(".active");

      // Article not visible? Bail.
      if (!$body.hasClass("is-article-visible")) return;

      // Add state?
      if (typeof addState != "undefined" && addState === true)
        history.pushState(null, null, "#");

      // Handle lock.

      // Already locked? Speed through "hide" steps w/o delays.
      if (locked) {
        // Mark as switching.
        $body.addClass("is-switching");

        // Deactivate article.
        $article.removeClass("active");

        // Hide article, main.
        $article.hide();
        $main.hide();

        // Show footer, header.
        $footer.show();
        $header.show();

        // Unmark as visible.
        $body.removeClass("is-article-visible");

        // Unlock.
        locked = false;

        // Unmark as switching.
        $body.removeClass("is-switching");

        // Window stuff.
        $window.scrollTop(0).triggerHandler("resize.flexbox-fix");

        return;
      }

      // Lock.
      locked = true;

      // Deactivate article.
      $article.removeClass("active");

      // Hide article.
      setTimeout(function() {
        // Hide article, main.
        $article.hide();
        $main.hide();

        // Show footer, header.
        $footer.show();
        $header.show();

        // Unmark as visible.
        setTimeout(function() {
          $body.removeClass("is-article-visible");

          // Window stuff.
          $window.scrollTop(0).triggerHandler("resize.flexbox-fix");

          // Unlock.
          setTimeout(function() {
            locked = false;
          }, delay);
        }, 25);
      }, delay);
    };

    // Articles.
    $main_articles.each(function() {
      var $this = $(this);

      // Close.
      $('<div class="close">Close</div>')
        .appendTo($this)
        .on("click", function() {
          location.hash = "";
        });

      // Prevent clicks from inside article from bubbling.
      $this.on("click", function(event) {
        event.stopPropagation();
      });
    });

    // Events.
    $body.on("click", function(event) {
      // Article visible? Hide.
      if ($body.hasClass("is-article-visible")) $main._hide(true);
    });

    $window.on("keyup", function(event) {
      switch (event.keyCode) {
        case 27:
          // Article visible? Hide.
          if ($body.hasClass("is-article-visible")) $main._hide(true);

          break;

        default:
          break;
      }
    });

    $window.on("hashchange", function(event) {
      // Empty hash?
      if (location.hash == "" || location.hash == "#") {
        // Prevent default.
        event.preventDefault();
        event.stopPropagation();

        // Hide.
        $main._hide();
      }

      // Otherwise, check for a matching article.
      else if ($main_articles.filter(location.hash).length > 0) {
        // Prevent default.
        event.preventDefault();
        event.stopPropagation();

        // Show article.
        $main._show(location.hash.substr(1));
      }
    });

    // Scroll restoration.
    // This prevents the page from scrolling back to the top on a hashchange.
    if ("scrollRestoration" in history) history.scrollRestoration = "manual";
    else {
      var oldScrollPos = 0,
        scrollPos = 0,
        $htmlbody = $("html,body");

      $window
        .on("scroll", function() {
          oldScrollPos = scrollPos;
          scrollPos = $htmlbody.scrollTop();
        })
        .on("hashchange", function() {
          $window.scrollTop(oldScrollPos);
        });
    }

    // Initialize.

    // Hide main, articles.
    $main.hide();
    $main_articles.hide();

    // Initial article.
    if (location.hash != "" && location.hash != "#")
      $window.on("load", function() {
        $main._show(location.hash.substr(1), true);
      });
  });
})(jQuery);
